package com.douglas.managesystem.controller.filed;

import com.douglas.managesystem.common.FileConfiguration;
import com.douglas.managesystem.common.ResponseResult;
import com.douglas.managesystem.common.SearchEntity;
import com.douglas.managesystem.common.UUIDUtils;
import com.douglas.managesystem.entity.FileManage;
import com.douglas.managesystem.entity.SystemConfig;
import com.douglas.managesystem.service.file.FileManageService;
import com.douglas.managesystem.service.system.SystemService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Date;

/**
 * @Description 文件管理
 * @Author 以梦为馬 <Douglas1314@126.com>
 * @Version V1.0.0
 * @Date 2020-10-29 10:31
 **/
@Controller
@RequestMapping("/file")
public class FileManageController {

    /**
     * 文件业务
     */
    @Autowired
    private FileManageService fileManageService;

    /**
     * 配置业务
     */
    @Autowired
    private SystemService systemService;

    /**
     * 文件路径配置
     */
    @Autowired
    private FileConfiguration fileConfiguration;
    /**
     * 1.去文件管理列表
     * @param model
     * @param params
     * @return
     */
    @GetMapping("/fileManage/list")
    public String toFile(Model model, SearchEntity params){
        PageInfo<FileManage> page = fileManageService.queryListByPage(params);
        model.addAttribute("file",page);
        return "admin/fileManage/list";
    }

    /**
     * 2.新增文件
     * @param fileManage
     * @return
     */
    @PostMapping("/add")
    @ResponseBody
    public ResponseResult addFile(@RequestBody FileManage fileManage){
        ResponseResult responseResult = new ResponseResult();
        try {
            fileManage.setId(UUIDUtils.getPrimaryKey());
            fileManage.setCode(UUIDUtils.getCharAndNumr(8));
            fileManage.setCreateTime(new Date());
            fileManageService.save(fileManage);
            responseResult.setSuccess(true);
            responseResult.setInfo("新增文件成功··^_^··");
            return responseResult;
        } catch (Exception e) {
            responseResult.setSuccess(false);
            responseResult.setInfo("新增文件失败··^…^··");
            return responseResult;
        }
    }

    /**
     * 3.下载文件
     * @param id
     * @param response
     */
    @RequestMapping("/download")
    public void download(String id, HttpServletResponse response){
        InputStream inputStream = null;
        OutputStream os = null;
        try{
            // 1.查询系统的配置
            SystemConfig system = systemService.getSystem();
            // 2.根据id查询文件
            FileManage fileManage = fileManageService.queryFileById(id);
            // 3.设置响应头和客户端保持文件名
//            response.setCharacterEncoding("UTF-8");
//            response.setContentType("multipart/form-data");
            // 通知浏览器以附件形式下载
            response.setContentType("text/html; charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileManage.getFilename(),"utf-8"));
            // 4.构建本地文件路径
            String filePath = fileConfiguration.getResourceDir() + system.getUploaddir() + fileManage.getFilepath();
            // 5.创建字符输入流，加载服务器本地文件
            inputStream = new FileInputStream(filePath);
            // 6.激活响应下载流 输出流
//            os = response.getOutputStream();
            os = new BufferedOutputStream(response.getOutputStream());
            // 7.使用字节1024单位 把输入的文件流数据响应输出
            byte[] b = new byte[1024];
            // 8.定义变量每次输入的长度
            int length;
            while ((length = inputStream.read(b)) > 0){
            // 9.输出：每次输出1024个单位字节 从0开始，每次length个长度
                os.write(b,0,length);
                os.flush();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 10.输出完毕关闭输出流  在关闭输入流  在finally中关闭最安全
            try {
                os.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 4.删除文件
     * @param id
     * @return
     */
    @RequestMapping("/fileManage/delete")
    public String deleteFile(String id){
        //1.先获取系统配置中的文件路径
        SystemConfig system = systemService.getSystem();
        //2.根据id查询文件的信息
        FileManage fileManage = fileManageService.queryFileById(id);
        //3.构建文件的本地路径
        File file = new File(fileConfiguration.getResourceDir() + system.getUploaddir() + fileManage.getFilepath());
        //4.判断本地文件是否存在  如果存在删除
        if(file.exists()){
            file.delete();
        }
        //5.根据id删除文件列表数据
        fileManageService.deleteFileById(id);
        return "redirect:/file/fileManage/list";
    }
}
